# Konwencja nazewnicza:
# X - przestrzen przeszukiwan
# XS - sekwencja punktow (moze byc pusta)
# U - liczba "losowa"
# US - sekwencja liczb losowych (moze byc pusta)

# zmienne globalne:
trace <- list() #slad punktow
random <- c() #liczby "losowe"

# zapis do sladu punktow
push<-function(XS)
{
  trace[[length(trace)+1]] <<- XS
}
# odczyt ze sladu punktow co najwyzej n elementow
# Inf oznacza cala historie
pop<-function(n=Inf)
{
  len <- length(trace)
  return(trace[max(len-n+1,1):len])
}

# inicjacja sladu
trace_init<-function(){
  trace <<- list()
}

# UG - generator liczb losowych - odczyt kolejnej wartosci 
# ze zbioru liczb losowych lub generacja
UG<-function()
{
  return(runif(1,min=0,max=1))
}

# inicjacja - generuje sekwencje punktow na podstawie 
# liczb losowych
op_init<-function(UG)
{
  return(XS)
}

# selekcja - generuje podsekwencje argumentu, posilkujac sie
# sekwencja liczb losowych
op_select<-function(XS, UG)
{
  return(XS)
}

# generacja - generuje sekwencje punktow na podstawie 
# innej sekwencji punktow oraz liczb losowych
op_generate<-function(XS,UG)
{
  return(XS)
}

# operator zagregowany - generuje sekwencje punktow na podstawie 
# innej sekwencji punktow oraz liczb losowych
op_agr<-function(XS,UG,op_select, op_generate)
{
  return (op_generate(op_select(XS, UG),UG))
}

# kryterium zatrzymania obserwuje punkty z historii, moze przyjmowac
# argumenty ktorych nie sposob przewidziec z gory
# zwraca wartosc logiczna
stop_criterion<-function(XS, stop_args=NULL)
{
  return(T)
}

#algorytm przeszukiwania 
search<-function(op_init, op_select,op_generate, stop_criterion, UG)
{
  trace_init()
  
  push(op_init(UG))
  while (!stop_criterion(pop()))
  {
    push(op_agr(pop(), UG,op_select,op_generate))
  }
}
